home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / asm-m32r / thread_info.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  5.1 KB  |  185 lines

  1. #ifndef _ASM_M32R_THREAD_INFO_H
  2. #define _ASM_M32R_THREAD_INFO_H
  3.  
  4. /* thread_info.h: m32r low-level thread information
  5.  *
  6.  * Copyright (C) 2002  David Howells (dhowells@redhat.com)
  7.  * - Incorporating suggestions made by Linus Torvalds and Dave Miller
  8.  * Copyright (C) 2004  Hirokazu Takata <takata at linux-m32r.org>
  9.  */
  10.  
  11. #ifdef __KERNEL__
  12.  
  13. #ifndef __ASSEMBLY__
  14. #include <asm/processor.h>
  15. #endif
  16.  
  17. /*
  18.  * low level task data that entry.S needs immediate access to
  19.  * - this struct should fit entirely inside of one cache line
  20.  * - this struct shares the supervisor stack pages
  21.  * - if the contents of this structure are changed, the assembly constants must also be changed
  22.  */
  23. #ifndef __ASSEMBLY__
  24.  
  25. struct thread_info {
  26.     struct task_struct    *task;        /* main task structure */
  27.     struct exec_domain    *exec_domain;    /* execution domain */
  28.     unsigned long        flags;        /* low level flags */
  29.     unsigned long        status;        /* thread-synchronous flags */
  30.     __u32            cpu;        /* current CPU */
  31.     int            preempt_count;    /* 0 => preemptable, <0 => BUG */
  32.  
  33.     mm_segment_t        addr_limit;    /* thread address space:
  34.                             0-0xBFFFFFFF for user-thread
  35.                            0-0xFFFFFFFF for kernel-thread
  36.                         */
  37.     struct restart_block    restart_block;
  38.  
  39.     __u8            supervisor_stack[0];
  40. };
  41.  
  42. #else /* !__ASSEMBLY__ */
  43.  
  44. /* offsets into the thread_info struct for assembly code access */
  45. #define TI_TASK        0x00000000
  46. #define TI_EXEC_DOMAIN    0x00000004
  47. #define TI_FLAGS    0x00000008
  48. #define TI_STATUS    0x0000000C
  49. #define TI_CPU        0x00000010
  50. #define TI_PRE_COUNT    0x00000014
  51. #define TI_ADDR_LIMIT    0x00000018
  52. #define TI_RESTART_BLOCK 0x000001C
  53.  
  54. #endif
  55.  
  56. #define PREEMPT_ACTIVE        0x10000000
  57.  
  58. /*
  59.  * macros/functions for gaining access to the thread information structure
  60.  *
  61.  * preempt_count needs to be 1 initially, until the scheduler is functional.
  62.  */
  63. #ifndef __ASSEMBLY__
  64.  
  65. #define INIT_THREAD_INFO(tsk)            \
  66. {                        \
  67.     .task        = &tsk,            \
  68.     .exec_domain    = &default_exec_domain,    \
  69.     .flags        = 0,            \
  70.     .cpu        = 0,            \
  71.     .preempt_count    = 1,            \
  72.     .addr_limit    = KERNEL_DS,        \
  73.     .restart_block = {            \
  74.         .fn = do_no_restart_syscall,    \
  75.     },                    \
  76. }
  77.  
  78. #define init_thread_info    (init_thread_union.thread_info)
  79. #define init_stack        (init_thread_union.stack)
  80.  
  81. #define THREAD_SIZE (2*PAGE_SIZE)
  82.  
  83. /* how to get the thread information struct from C */
  84. static inline struct thread_info *current_thread_info(void)
  85. {
  86.     struct thread_info *ti;
  87.  
  88.     __asm__ __volatile__ (
  89.         "ldi    %0, #%1            \n\t"
  90.         "and    %0, sp            \n\t"
  91.         : "=r" (ti) : "i" (~(THREAD_SIZE - 1))
  92.     );
  93.  
  94.     return ti;
  95. }
  96.  
  97. #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
  98.  
  99. /* thread information allocation */
  100. #ifdef CONFIG_DEBUG_STACK_USAGE
  101. #define alloc_thread_info(tsk)                    \
  102.     ({                            \
  103.         struct thread_info *ret;            \
  104.                                  \
  105.          ret = kzalloc(THREAD_SIZE, GFP_KERNEL);        \
  106.                                 \
  107.          ret;                        \
  108.      })
  109. #else
  110. #define alloc_thread_info(tsk) kmalloc(THREAD_SIZE, GFP_KERNEL)
  111. #endif
  112.  
  113. #define free_thread_info(info) kfree(info)
  114.  
  115. #define TI_FLAG_FAULT_CODE_SHIFT    28
  116.  
  117. static inline void set_thread_fault_code(unsigned int val)
  118. {
  119.     struct thread_info *ti = current_thread_info();
  120.     ti->flags = (ti->flags & (~0 >> (32 - TI_FLAG_FAULT_CODE_SHIFT)))
  121.         | (val << TI_FLAG_FAULT_CODE_SHIFT);
  122. }
  123.  
  124. static inline unsigned int get_thread_fault_code(void)
  125. {
  126.     struct thread_info *ti = current_thread_info();
  127.     return ti->flags >> TI_FLAG_FAULT_CODE_SHIFT;
  128. }
  129.  
  130. #else /* !__ASSEMBLY__ */
  131.  
  132. #define THREAD_SIZE    8192
  133.  
  134. /* how to get the thread information struct from ASM */
  135. #define GET_THREAD_INFO(reg)    GET_THREAD_INFO reg
  136.     .macro GET_THREAD_INFO reg
  137.     ldi    \reg, #-THREAD_SIZE
  138.     and    \reg, sp
  139.     .endm
  140.  
  141. #endif
  142.  
  143. /*
  144.  * thread information flags
  145.  * - these are process state flags that various assembly files may need to access
  146.  * - pending work-to-be-done flags are in LSW
  147.  * - other flags in MSW
  148.  */
  149. #define TIF_SYSCALL_TRACE    0    /* syscall trace active */
  150. #define TIF_SIGPENDING        1    /* signal pending */
  151. #define TIF_NEED_RESCHED    2    /* rescheduling necessary */
  152. #define TIF_SINGLESTEP        3    /* restore singlestep on return to user mode */
  153. #define TIF_IRET        4    /* return with iret */
  154. #define TIF_RESTORE_SIGMASK    8    /* restore signal mask in do_signal() */
  155. #define TIF_USEDFPU        16    /* FPU was used by this task this quantum (SMP) */
  156. #define TIF_POLLING_NRFLAG    17    /* true if poll_idle() is polling TIF_NEED_RESCHED */
  157. #define TIF_MEMDIE        18    /* OOM killer killed process */
  158. #define TIF_FREEZE        19    /* is freezing for suspend */
  159.  
  160. #define _TIF_SYSCALL_TRACE    (1<<TIF_SYSCALL_TRACE)
  161. #define _TIF_SIGPENDING        (1<<TIF_SIGPENDING)
  162. #define _TIF_NEED_RESCHED    (1<<TIF_NEED_RESCHED)
  163. #define _TIF_SINGLESTEP        (1<<TIF_SINGLESTEP)
  164. #define _TIF_IRET        (1<<TIF_IRET)
  165. #define _TIF_RESTORE_SIGMASK    (1<<TIF_RESTORE_SIGMASK)
  166. #define _TIF_USEDFPU        (1<<TIF_USEDFPU)
  167. #define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
  168. #define _TIF_FREEZE        (1<<TIF_FREEZE)
  169.  
  170. #define _TIF_WORK_MASK        0x0000FFFE    /* work to do on interrupt/exception return */
  171. #define _TIF_ALLWORK_MASK    0x0000FFFF    /* work to do on any return to u-space */
  172.  
  173. /*
  174.  * Thread-synchronous status.
  175.  *
  176.  * This is different from the flags in that nobody else
  177.  * ever touches our thread-synchronous status, so we don't
  178.  * have to worry about atomic accesses.
  179.  */
  180. #define TS_USEDFPU        0x0001    /* FPU was used by this task this quantum (SMP) */
  181.  
  182. #endif /* __KERNEL__ */
  183.  
  184. #endif /* _ASM_M32R_THREAD_INFO_H */
  185.